﻿//Código desenvolvido na integra por João Ribeiro.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlServerCe;
using System.Data.SqlClient;
using System.Web.Security;
using System.Net.Mail;

namespace GestaoContas
{
    public partial class VerAlterarConta : Form
    {
        private string _connectionStringLogin;
        private string _connectionStringJardimBD;
        private int _selectedRow = 0;
        private ContaDeUtilizador _contaUtilizador;
        private ContaLogin _contaLogin;

        private int _pessoaId;

        public int PessoaId
        {
            get { return _pessoaId; }
            set { _pessoaId = value; }
        }

        private string _nome;

        public string Nome
        {
            get { return _nome; }
            set { _nome = value; }
        }

        private string _morada;

        public string Morada
        {
            get { return _morada; }
            set { _morada = value; }
        }

        private int _telefone;

        public int Telefone
        {
            get { return _telefone; }
            set { _telefone = value; }
        }

        private int _telemovel;

        public int Telemovel
        {
            get { return _telemovel; }
            set { _telemovel = value; }
        }

        private int _contribuinte;

        public int Contribuinte
        {
            get { return _contribuinte; }
            set { _contribuinte = value; }
        }

        private string _email;

        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }

        private string _userName;

        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }

        private string _role;

        public string Role
        {
            get { return _role; }
            set { _role = value; }
        }

        private string _userId;

        public string UserId
        {
            get { return _userId; }
            set { _userId = value; }
        }

        private bool _contaActivada;

        public bool ContaActivada
        {
            get { return _contaActivada; }
            set { _contaActivada = value; }
        }

        private string _passAntiga;

        public string PassAntiga
        {
            get { return _passAntiga; }
            set { _passAntiga = value; }
        }

        private string _pass;

        public string Pass
        {
            get { return _pass; }
            set { _pass = value; }
        }

        private string _passConfirma;

        public string PassConfirma
        {
            get { return _passConfirma; }
            set { _passConfirma = value; }
        }


        public VerAlterarConta()
        {
            InitializeComponent();
        }

        public VerAlterarConta(bool ver, int tabPage, string nomeQuerySearch, string contribuinteQuerySearch)
        {
            InitializeComponent();
            _contaUtilizador = new ContaDeUtilizador();

            _connectionStringLogin = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
            this.dataGridViewEducando.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dataGridViewEducando_MouseDown);

            _contaUtilizador.PreencheOjectoContaUtilizador(nomeQuerySearch, contribuinteQuerySearch);
            _contaLogin = new ContaLogin(_contaUtilizador.UserId);
            PreencheForm();

            if (tabPage == 1)
            {
                tabControlUtilizador.SelectedTab = tabPage1;
            }
            else
            {
                tabControlUtilizador.SelectedTab = tabPage2;
            }

            if (ver)
            {
                textBoxNome.ReadOnly = true;
                textBoxMorada.ReadOnly = true;
                textBoxEmail.ReadOnly = true;
                textBoxTelefone.ReadOnly = true;
                textBoxTelemovel.ReadOnly = true;
                textBoxContribuinte.ReadOnly = true;

                textBoxUser.ReadOnly = true;
                comboBoxTipoConta.Enabled = false;
                maskedTextBoxPassAntiga.ReadOnly = true;
                maskedTextBoxPassword.ReadOnly = true;
                maskedTextBoxConfirmaPassword.ReadOnly = true;
                checkBoxContaActiva.Enabled = false;
                buttonRecuperaPass.Enabled = false;

                buttonOk.Enabled = false;
                adicionarToolStripMenuItem.Enabled = false;
                alterarToolStripMenuItem.Enabled = false;
            }
            else
            {
                textBoxUser.ReadOnly = true;
            }
            PreencheGridViewEducando(_contaUtilizador.PessoaId);
        }

        /// <summary>
        /// Preenche a gridview dos educandos que estão afectos à pessoa visualizada.
        /// </summary>
        /// <param name="pessoaId">id da pessoa</param>
        private void PreencheGridViewEducando(int pessoaId)
        {
            string query = @"SELECT Nome, DataNascimento as ""Data de nascimento"", Observacoes as ""Observação"" FROM Crianca WHERE Pessoa_PessoaId = " + pessoaId;
            try
            {
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
                SqlCeCommand cmd = new SqlCeCommand(query, conn);

                SqlCeDataAdapter da = new SqlCeDataAdapter();
                DataSet ds = new DataSet();

                da.SelectCommand = cmd;

                da.Fill(ds);
                dataGridViewEducando.DataSource = ds.Tables[0];
                dataGridViewEducando.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
            }
        
        }

        /// <summary>
        /// Preenche a form com os dados do utilizador.
        /// </summary>
        private void PreencheForm()
        {
            textBoxNome.Text = _contaUtilizador.Nome;
            textBoxMorada.Text = _contaUtilizador.Morada;
            textBoxTelefone.Text = _contaUtilizador.Telefone.ToString();
            textBoxTelemovel.Text = _contaUtilizador.Telemovel.ToString();
            textBoxEmail.Text = _contaUtilizador.Email;
            textBoxContribuinte.Text = _contaUtilizador.Contribuinte.ToString();
            _userId = _contaUtilizador.UserId;

            PreencheComboBoxTipoConta();
            comboBoxTipoConta.Text = _contaUtilizador.RoleDoUtilizador;

            textBoxUser.Text = _contaLogin.NomeUtilizador;
            checkBoxContaActiva.Checked = _contaLogin.ContaActiva;
        }

        /// <summary>
        /// Preenche a combobox do tipo de conta com os dados da tabela aspnet_Roles
        /// </summary>
        private void PreencheComboBoxTipoConta()
        {
            try
            {
                string query = @"SELECT RoleName FROM aspnet_Roles";
                SqlConnection conn = new SqlConnection(_connectionStringLogin);

                SqlCommand cmd = new SqlCommand(query, conn);

                SqlDataAdapter da = new SqlDataAdapter();
                DataSet ds = new DataSet();

                da.SelectCommand = cmd;

                da.Fill(ds);
                comboBoxTipoConta.DisplayMember = "RoleName";
                comboBoxTipoConta.ValueMember = "RoleName";
                comboBoxTipoConta.DataSource = ds.Tables[0];
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        // Código retirado e adaptado de:
        // http://msdn.microsoft.com/en-us/library/77f10054.aspx
        private bool EmailPassword(string email, string password)
        {
            bool mailEnviado = true;
            try
            {
                MailMessage Message = new MailMessage("administrador@jardim.infancia.com", email);
                Message.Subject = "A sua password da conta de acesso ao jardim de infância.";

                Message.Body = "A sua password é: " + password;
                //Message.BodyEncoding = Encoding.Default;

                SmtpClient SmtpMail = new SmtpClient("smtpalunos.ips.pt");

                SmtpAuth autenticacao = new SmtpAuth(SmtpMail.Host);
                if (autenticacao.ShowDialog() == DialogResult.OK)
                {
                    SmtpMail.Credentials = new System.Net.NetworkCredential(autenticacao.UserName, autenticacao.Password);
                }

                //SmtpMail.EnableSsl = true;

                SmtpMail.Send(Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show("An exception occurred while sending your password. Please try again.\n" + ex.Message);
                mailEnviado = false;
            }
            return mailEnviado;
        }

        private void buttonOk_Click(object sender, EventArgs e)
        {
            _pessoaId = _contaUtilizador.PessoaId;
            _nome = textBoxNome.Text;
            _morada = textBoxMorada.Text;
            _telefone = int.Parse(textBoxTelefone.Text);
            _telemovel = int.Parse(textBoxTelemovel.Text);
            _email = textBoxEmail.Text;
            _contribuinte = int.Parse(textBoxContribuinte.Text);
            _role = comboBoxTipoConta.Text;
            _userName = textBoxUser.Text;
            if (checkBoxContaActiva.Checked)
            {
                _contaActivada = true;
            }
            else
            {
                _contaActivada = false;
            }
            _passAntiga = maskedTextBoxPassAntiga.Text;
            _pass = maskedTextBoxPassword.Text;
            _passConfirma = maskedTextBoxConfirmaPassword.Text;
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void buttonRecuperaPass_Click(object sender, EventArgs e)
        {
            bool mailEnviado = false;
            try
            {
                MembershipUser user = Membership.GetUser(textBoxUser.Text);
                string novaPassword = user.ResetPassword();
                mailEnviado = EmailPassword(user.Email, novaPassword);
            }
            catch (System.Configuration.Provider.ProviderException ex)
            {
                MessageBox.Show("Ocorreu um erro na reposição da password...");
            }
            if (mailEnviado)
            {
                MessageBox.Show("A password foi enviada para o mail.");
            }
        }

        private void dataGridViewEducando_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                if (e.Button == MouseButtons.Right && dataGridViewEducando.RowCount > 0)
                {
                    var hti = dataGridViewEducando.HitTest(e.X, e.Y);
                    dataGridViewEducando.ClearSelection();
                    dataGridViewEducando.Rows[hti.RowIndex].Selected = true;
                    _selectedRow = hti.RowIndex;
                }
            }
            catch (Exception ex){ }
        }

        private void adicionarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Educando edu = new Educando(_contaUtilizador.PessoaId);
            edu.Text = "Adicionar Educando";

            if (edu.ShowDialog() == DialogResult.OK)
            {
                FichaEducando educando = new FichaEducando(
                    edu.Nome, 
                    edu.Frequenta, 
                    edu.DataNascimento, 
                    edu.Observacoes, 
                    edu.FotoPath,
                    edu.PessoaId);
                if (educando.GravaCrianca(false))
                {
                    MessageBox.Show("Criança adicionada com sucesso.");
                }

            }
            PreencheGridViewEducando(_contaUtilizador.PessoaId);
        }

        private void verToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridViewEducando.RowCount > 0)
            {
                string nomeQuerySearch = dataGridViewEducando.Rows[_selectedRow].Cells[0].Value.ToString();

                Educando edu = new Educando(false, nomeQuerySearch);
                edu.Text = "Ver Educando";

                edu.ShowDialog();
            }
        }

        private void alterarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridViewEducando.RowCount > 0)
            {
                string nomeQuerySearch = dataGridViewEducando.Rows[_selectedRow].Cells[0].Value.ToString();
                string msg = null;
                FichaEducando fichaAntiga = new FichaEducando();
                bool existeFoto = fichaAntiga.PreencheObjectoEducando(nomeQuerySearch);

                Educando edu = new Educando(true, nomeQuerySearch);
                edu.Text = "Alterar Educando";
                if (edu.ShowDialog() == DialogResult.OK)
                {
                    FichaEducando fichaAlterada = new FichaEducando(
                        edu.CriancaId,
                        edu.Nome,
                        edu.Frequenta,
                        edu.DataNascimento,
                        edu.Observacoes,
                        edu.FotoPath,
                        edu.FotoId,
                        edu.PessoaId);

                    if (!fichaAlterada.Igual(fichaAntiga))
                    {
                        if (fichaAlterada.GravaCrianca(true))
                        {
                            msg += "Dados da criança alterados com sucesso.\n";
                        }
                    }
                    if (!fichaAlterada.FotoIgual(fichaAntiga))
                    {
                        if (existeFoto)
                        {
                            if (fichaAlterada.updateFoto(fichaAlterada.FotoPath, fichaAlterada.FotoId))
                            {
                                msg += "Foto alterada com sucesso.\n";
                            }
                        }
                        else
                        {
                            if (fichaAlterada.InsereFoto(fichaAlterada.FotoPath, fichaAlterada.CriancaId))
                            {
                                msg += "Foto inserida com sucesso.";
                            }
                        }
                    }
                    if (msg != null)
                    {
                        MessageBox.Show(msg);
                    }
                }

                PreencheGridViewEducando(_contaUtilizador.PessoaId);
            }
        }

        private void dataGridViewEducando_Click(object sender, EventArgs e)
        {
            PreencheGridViewEducando(_contaUtilizador.PessoaId);
        }
    }
}
